package com.scau402.system.service.impl;

import java.util.List;

import com.scau402.common.constant.TenantConstants;
import com.scau402.common.utils.DateUtils;
import com.scau402.common.utils.StringUtils;
import com.scau402.common.utils.code.TenantCodeUtils;
import com.scau402.system.domain.vo.SysTenantVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.scau402.system.mapper.SysTenantMapper;
import com.scau402.system.domain.SysTenant;
import com.scau402.system.service.ISysTenantService;

import static com.scau402.common.utils.SecurityUtils.getLoginUser;

/**
 * 租户信息Service业务层处理
 * 
 * @author ruoyi
 * @date 2023-06-27
 */
@Service
public class SysTenantServiceImpl implements ISysTenantService 
{
    @Autowired
    private SysTenantMapper sysTenantMapper;

    /**
     * 查询租户信息
     * 
     * @param tenantId 租户信息主键
     * @return 租户信息
     */
    @Override
    public SysTenant selectSysTenantByTenantId(Long tenantId)
    {
        return sysTenantMapper.selectSysTenantByTenantId(tenantId);
    }

    /**
     * 查询租户信息列表
     * 
     * @param sysTenant 租户信息
     * @return 租户信息
     */
    @Override
    public List<SysTenantVO> selectSysTenantList(SysTenant sysTenant)
    {
        return sysTenantMapper.selectSysTenantList(sysTenant);
    }

    /**
     * 新增租户信息
     * 
     * @param sysTenant 租户信息
     * @return 结果
     */
    @Override
    public int insertSysTenant(SysTenant sysTenant)
    {
        sysTenant.setCreateTime(DateUtils.getNowDate());
        return sysTenantMapper.insertSysTenant(sysTenant);
    }

    /**
     * 检查租户编码是否唯一
     * @param sysTenant 租户信息
     * @return
     */
    @Override
    public boolean checkTenantCodeUnique(SysTenant sysTenant)
    {
        if (sysTenantMapper.checkTenantCodeUnique(sysTenant)>0)
        {
            return TenantConstants.NOT_UNIQUE;
        }
        return TenantConstants.UNIQUE;
    }

    /**
     * 修改租户信息
     * 
     * @param sysTenant 租户信息
     * @return 结果
     */
    @Override
    public int updateSysTenant(SysTenant sysTenant)
    {
        sysTenant.setUpdateTime(DateUtils.getNowDate());
        return sysTenantMapper.updateSysTenant(sysTenant);
    }

    /**
     * 批量删除租户信息
     * 
     * @param tenantIds 需要删除的租户信息主键
     * @return 结果
     */
    @Override
    public int deleteSysTenantByTenantIds(Long[] tenantIds)
    {
        return sysTenantMapper.deleteSysTenantByTenantIds(tenantIds);
    }

    /**
     * 删除租户信息信息
     * 
     * @param tenantId 租户信息主键
     * @return 结果
     */
    @Override
    public int deleteSysTenantByTenantId(Long tenantId)
    {
        return sysTenantMapper.deleteSysTenantByTenantId(tenantId);
    }


    @Override
    public String getMaxCode() {
        return sysTenantMapper.getMaxCode();
    }

    @Override
    public SysTenant selectSysTenantByTenantCode(String tenantCode) {
        return sysTenantMapper.selectSysTenantByTenantCode(tenantCode);
    }

    /**
     * 检查租户名称是否唯一
     * @param sysTenant
     * @return
     */
    @Override
    public boolean checkTenantNameUnique(SysTenant sysTenant) {
        if (sysTenantMapper.checkTenantNameUnique(sysTenant)>0)
        {
            return TenantConstants.NOT_UNIQUE;
        }
        return TenantConstants.UNIQUE;
    }

    @Override
    public List<SysTenant> selectSysTenantReviewList(SysTenant sysTenant) {
        return sysTenantMapper.selectSysTenantReviewList(sysTenant);
    }

    @Override
    public int updateReview(SysTenant tenant) {
        return sysTenantMapper.review(tenant);
    }

    @Override
    public String reviewTenant(SysTenant tenant, String review) {
        // 设置审核结果 0未审核 1审核通过 2审核未通过
        tenant.setReview(review);

        // 审核通过将租户状态改为启用
        if(review.equals(TenantConstants.REVIEW_PASS)) {
            tenant.setStatus(TenantConstants.STATUS_ENABLE);
        }

        // 审核人ID
        tenant.setReviewById(getLoginUser().getTenantId());
        // 审核人用户名
        tenant.setReviewByName(getLoginUser().getUsername());
        // 审核时间
        tenant.setReviewTime(DateUtils.getNowDate());

        updateReview(tenant);

        if(review.equals(TenantConstants.REVIEW_PASS)) {
            return TenantConstants.REVIEW_PASS;
        } else if (review.equals(TenantConstants.REVIEW_REJECT)) {
            return TenantConstants.REVIEW_REJECT;
        } else {
            return "";
        }
    }

    @Override
    public String getNewCode() throws InterruptedException {
        // 获取数据库中最大的编码
        String maxCode = getMaxCode();

        // 返回maxCode为NULL，及当前数据库没有数据，从0开始
        if(StringUtils.isNull(maxCode)) {
            maxCode = "0";
        }

        // 设置redis的当前编码
        TenantCodeUtils tenantCodeUtils = new TenantCodeUtils();
        tenantCodeUtils.setCurrentCodeToMax(maxCode);
        return tenantCodeUtils.getNewCode();
    }
}
